篇首语:本文由编程笔记#小编为大家整理,主要介绍了人工智能-关于CV的这些简单操作你真的都会了吗?相关的知识,希望对你有一定的参考价值。
🎉作者简介:👓目前在读计算机研究生。主要研究方向是人工智能和群智能算法方向。目前熟悉python网页爬虫、机器学习、计算机视觉(OpenCV)、群智能算法。然后正在学习深度学习的相关内容。以后可能会涉及到网络安全相关领域,毕竟这是每一个学习计算机的梦想嘛!👓
📝目前更新:🎯目前已经更新了关于网络爬虫得相关系列、机器学习得相关知识、目前正在更新计算机视觉-OpenCV,后续将继续更新其他知识。🎯
📃个人主页:吃猫的鱼python个人主页
🔎支持:如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦!🎁这就是给予我最大的支持!🎁
💛本文摘要💛:
本文我们将继续讲解相关计算机视觉的相关知识。具体包括以下几个内容。
🌖1.阈值分割基础理论知识
🌖2.阈值处理代码和实现
🌖3.图像平滑-包括均值滤波、方框滤波、高斯滤波、中值滤波和卷积
🎆OpenCV提供的视觉处理算法非常丰富,并且它部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序,所以很多人用它来做算法的移植,OpenCV的代码经过适当改写可以正常的运行在DSP系统和ARM嵌入式系统中,这种移植在大学中经常作为相关专业本科生毕业设计或者研究生课题的选题。 |
🎆OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库得到更快的处理速度。 |
🎆可应用领域包括: 1、人机互动 2、物体识别 3、图像分割 4、人脸识别 5、动作识别 6、运动跟踪 7、机器人 8、运动分析 9、机器视觉 10、结构分析 11、汽车安全驾驶等方面 |
阈值分割得六种形态图:
🎉1.第一种为原始图像像素值分布图。
🎉2.二进制阈值化:假设我们设定阈值为189,如果大于189得像素值那么我们就把该像素值设置为最大值,也就是255。如果低于189得像素值,那么我们就设置该像素值为0。
🎉3.反二进制阈值化:根据意思我们就可以知道和二进制阈值化相反,那么就说明如果我们设定阈值为189,那么大于189得像素值就是0,如果低于189得像素值,那么就设定像素值为255.
🎉4.截断阈值化:假设我们设定阈值时127,那么如果像素值大于127,那么我们直接设定像素值为127,如果低于127,那么就保持像素值不变。
🎉5.反阈值化为0:假如我们设定阈值为127,那么如果像素大于127,那么我们将新的像素值设定为0,如果低于127,那么我们将保留原始得像素值。
🎉6.阈值化为0:假设我们依旧设定阈值为127,那么如果像素值高于127,那么我们保持不变,如果低于127,那么我们设定新的像素值为0.
阈值处理函数:
🔮函数threshold
retval, dst=cv2.threshold(src, thresh, maxval, type)
其中src表示原图像,thresh表示阈值,maxval表示最大值,type表示类型。函数对应返回两个值,分别是阈值和处理结果。 |
🔮二进制阈值化代码:
核心代码:cv2.THRESH_BINARY
import cv2
a=cv2.imread("image\\\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
以lena为例子,处理结果是:
可以看出来,将原来的灰度图像处理成了只有0和最大值255的图像,可以说处理成了二值图像。
🔮反二进制阈值化代码:
核心代码:cv2.THRESH_BINARY_INV
import cv2
a=cv2.imread("image\\\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
这里只需要改动一个位置就可以,那么处理结果为:
就是和原来的二进制阈值化相反处理。
🔮截断阈值化:
核心代码:cv2.THRESH_TRUNC
import cv2
a=cv2.imread("image\\\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TRUNC)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
处理结果:
也就是说将图像的明亮部分都处理在阈值以下。
🔮反阈值化为0代码:
核心代码:cv2.THRESH_TOZERO_INV
port cv2
a=cv2.imread("image\\\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO_INV)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
处理结果是:
将所有亮的地方都处理为黑色。也就是说高于阈值的地方都处理呈黑色。
🔮阈值化为0代码:
核心代码:cv2.THRESH_TOZERO
import cv2
a=cv2.imread("image\\\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
将低于阈值部分都处理成黑色,其他不变。
✒️均值滤波:很明显我们通过白话来讲就是说肯定跟平均值有关,那么怎么和平均值相关的呢? |
首先我们来看一下一个图像的区域像素值分布:
然后我们来看中间区域的红色部分为例子进行均值滤波处理计算:
红色点的像素新值=蓝色背景区域像素值之和除25
红色点的像素新值=
((197+25+106+156+159)+(149+40+107+5+71)+
(163+198+226+223+156)+(222+37+68+193+157)+
(42+72+250+41+75))/25
针对原始图像内的像素点,逐个采用核进行处理,得到结果图像。也就是说每一个像素点都进行这个操作。那么有什么用呢?作用就是可以把尖锐的像素点的值给模糊掉然我们来看例子
函数结果:处理结果=cv2.blur(原始图像,核大小)
核大小:以(宽度,高度)形式表示的元组
import cv2
o=cv2.imread("image\\\\lenaNoise.png")
r=cv2.blur(o,(5,5))
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
专业一点来讲就是可以除噪:
⚽️方框滤波:主要是看函数的最后一个属性,如果设置为-1,那么方框滤波与均值滤波一样的效果,如果设置成1,那么就表示核函数内进行相加。具体请看下面讲解。 |
主要函数:boxFilter。 ⚽️运行结果=cv2. boxFilter(原始图像,目标图像深度,核大小,normalize属性),⚽️其中原始图像都理解,⚽️目标图像深度通常设置成-1,表示与原始图像相同,⚽️核函数请看下方图一,如果设置呈元组(5,5)就表示为下方左边图。⚽️normalize属性表示是否对图像进行归一化处理,如果进行归一化处理就设置成ture,不设置就为false。⚽️那么如果设置归一化处理的结果就是与均值滤波完全一致,如果不设置归一化处理,那么就表示核函数之间相加。看图二 |
⚽️方框滤波代码部分
normalize=1就表示进行归一化处理,和不设置一样,也就是说默认就是进行归一化处理。如果设置为0,就表示不进行归一化处理。代码分别是:
import cv2
o=cv2.imread("image\\\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5),normalize=1)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
o=cv2.imread("image\\\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5),normalize=0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
对应结果分别是:
不进行归一化处理如果5×5的值相加很容易超过255,那么我们就都变成了255的像素值,也就都是白色了。
那么如果我们设置核函数为2×2呢,让核函数小一点。那么对应的结果为:
这样滤波后的结果就不都是255了,就变成了有的地方的像素值是小于255的。但是像素值都比之前要高很多。
🎴高斯滤波:其实高斯滤波很简单,原理就是谁离我目标点越近,我就跟谁越好,给他的东西越多,对应官方的话就是给予权重越大。让临近的像素值有更高的重要度。 |
🎴高斯滤波核心函数:GaussianBlur函数。 |
🎴dst = cv2.GaussianBlur( src , ksize , sigmaX ) |
其中:
🎴src为原始图像
🎴ksize核函数的大小,这里需要注意,就是设置的核函数的大小必须为奇数大小
🎴sigmaX表示高斯滤波函数X方向的方差,这里表示成水平方向的规律就好了。用来控制权重。
sigmaX=0时: sigma = 0.3((ksize-1)0.5 - 1) + 0.8
🎴高斯滤波对应代码:
import cv2
o=cv2.imread("image\\\\lenaNoise.png")
r=cv2.GaussianBlur(o,(3,3),0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
这里可以看出,使用高斯滤波可以完成去噪的功能,但是他是缓和的去噪,根据他的原理我们就可以知道。
👑中值滤波:这里就很好理解了,比如我们取了核函数的大小,然后把核函数中的像素值进行排序,然后取中值替换到现在的值。 |
👑主要函数:medianBlur函数 |
👑dst = cv2.medianBlur( src , ksize ) |
其中src表示原始图像,ksize表示核函数的大小。同样这里的核函数的大小必须是奇数。且不是原则,直接写数字就可以,比如3就表示3*3
👑中值滤波代码部分
import cv2
o=cv2.imread("image\\\\lenaNoise.png")
r=cv2.medianBlur(o,3)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
这里去噪最为完美因为很明显的就把很高的像素点都去掉了!!!
🍼卷积:其实卷积也很简单的,之前我们介绍的均值滤波、中值滤波、方框滤波及高斯滤波都是基于图像本身做出操作,那么卷积就是我们设置了一个卷积核,用这个核去和我们图像的每一个像素值做乘法。 |
🍼2D卷积核心函数:
卷积核函数:kernel = np.ones((5,5),np.float32)/25
设置的是5*5的卷积核。如图:
🍼2D卷积核心函数:r=cv2.filter2D( o , -1 ,f )
-1表示图像深度和原图像一致,最后一个f表示卷积核的意思。
🍼代码部分:
import cv2
import numpy as np
o=cv2.imread("image\\lenacolor.png")
f=np.ones((5,5),np.float32)/25
r=cv2.filter2D(o,-1,f)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
所以我们可以通过原理得到如果卷积核设置的越大,那么图像就会越模糊。
import cv2
import numpy as np
o=cv2.imread("image\\lenacolor.png")
f=np.ones((10,10),np.float32)/100
r=cv2.filter2D(o,-1,f)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
📒文章适合于所有的相关人士进行学习📒
📒各位看官看完了之后不要立刻转身呀📒
📒期待三连关注小小博主加收藏📒
📒小小博主回关快 会给你意想不到的惊喜呀📒
各位老板动动小手给小弟点赞收藏一下,多多支持是我更新得动力!!!